// 引入defineStore方法创建小仓库
import { defineStore } from 'pinia'

import { ref, reactive } from 'vue'
import { reqLogin, reqUserInfo, reqLogout } from '@/api/user/index'
// import type { loginForm, loginResponseData } from '@/type/type'
import { constantRoute } from '@/router/router' //引入常量路由
// 引入常用工具piniaUser：清除localStorage的数据
import { REMOVE_USER } from '@/utils/piniaUser'

export const useUserStore = defineStore(
  'User',
  () => {
    // 1、用户登录请求：【获取Token】
    const token = ref('')
    const userLogin = async (data: any) => {
      // console.log(data);
      const result: any = await reqLogin(data)
      // console.log('result',result);

      if (result.code === 200) {
        token.value = result.data as string
        return 'ok' //保证async函数返回一个成功的promise
      } else {
        return Promise.reject(new Error(result.data))
      }
    }

    // 2、获取用户信息请求：登陆成功后，使用Token去请求【用户信息】：获取【用户名+头像】
    // config.headers.token = userStore.token
    let username = ref('')
    let avatar = ref('')

    const getuserInfo = async () => {
      let result = await reqUserInfo() //获取用户信息请求
      // console.log(result);

      if (result.code === 200) {
        avatar.value = result.data.avatar
        username.value = result.data.name
        return 'ok'
      } else {
        return Promise.reject(new Error(result.message))
      }
    }

    // 3、退出登录请求（正常工作是使用【退出登录接口】，这里mock没有就不使用了）
    //作用：通知服务器本地用户唯一标识失效,也就是去掉token，还有清空username和avatar
    const userLogout = async () => {
      const result = await reqLogout()
      console.log(result)
      if (result.code == 200) {
        token.value = ''
        username.value = ''
        avatar.value = ''
        // localStorage.removeItem('User')
        REMOVE_USER() //清除pinia缓存在localStorage的数据的封装
        return 'ok' //返回一个成功的promise
      } else {
        return Promise.reject(new Error(result.message))
      }
    }

    // 4、store中存储《常量路由》：用于Aside组件生成菜单的常量路由
    const routes = reactive(constantRoute)

    return {
      token,
      userLogin,
      routes,
      username,
      avatar,
      getuserInfo,
      userLogout,
    }
  },
  {
    persist: true,
    // 说明：pinia默认以key为User，值为token、avatar、username等形式进行对象式的缓存在locaStorage
  },
)
